package com.example.wiki.controller;

import com.example.wiki.entity.resp.CommonResp;
import com.example.wiki.exception.BusinessException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

//统一处理异常的中心【控制层】
@ControllerAdvice
public class ControllerExceptionHandler {

    private static final Logger LOG = LoggerFactory.getLogger(ControllerExceptionHandler.class);

    //定义不同类型的异常的处理逻辑【BindException】
    @ExceptionHandler(value = BindException.class)
    @ResponseBody
    public CommonResp validExceptionHandler(BindException exception) {
        //创建响应对象
        CommonResp commonResp = new CommonResp();
        //日志打印信息
        LOG.warn("参数校验错误：{}", exception.getBindingResult().getAllErrors().get(0).getDefaultMessage());
        //回设响应的标志和数据
        commonResp.setSuccess(false);
        commonResp.setMessage(exception.getBindingResult().getAllErrors().get(0).getDefaultMessage());
        //返回
        return commonResp;
    }

    //定义不同类型的异常的处理逻辑【MethodArgumentNotValidException】
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    @ResponseBody
    public CommonResp validExceptionHandler(MethodArgumentNotValidException exception) {
        //创建响应对象
        CommonResp commonResp = new CommonResp();
        //日志打印信息
        LOG.warn("参数校验错误：{}", exception.getBindingResult().getAllErrors().get(0).getDefaultMessage());
        //回设响应的标志和数据
        commonResp.setSuccess(false);
        commonResp.setMessage(exception.getBindingResult().getAllErrors().get(0).getDefaultMessage());
        //返回
        return commonResp;
    }

    //定义业务的异常的处理逻辑【BusinessException】
    @ExceptionHandler(value = BusinessException.class)
    @ResponseBody
    public CommonResp validExceptionHandler(BusinessException exception) {
        //创建响应对象
        CommonResp commonResp = new CommonResp();
        //日志打印信息
        LOG.warn("业务操作异常：{}", exception.getCode().getDesc());
        //回设响应的标志和数据
        commonResp.setSuccess(false);
        commonResp.setMessage(exception.getCode().getDesc());
        //返回
        return commonResp;
    }

    //定义一个全局的全类型的父异常捕抓
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public CommonResp validExceptionHandler(Exception exception) {
        //创建响应对象
        CommonResp commonResp = new CommonResp();
        //日志打印信息
        LOG.error("业务操作异常：{}", exception.getMessage());
        //回设响应的标志和数据
        commonResp.setSuccess(false);
        commonResp.setMessage("系统出现异常，请联系管理员查看！！！");
        //返回
        return commonResp;
    }

}
